home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 20 / Cream of the Crop 20 (Terry Blount) (1996).iso / program / 3dview12.zip / VESAASM.ASM < prev    next >
Assembly Source File  |  1996-05-30  |  39KB  |  1,864 lines

  1. .data
  2.  
  3. ; ##### VESAOffs is a table of Lineoffset values.
  4. ; ##### For example VESAOffs[100] is the Offset of Screenline 100.
  5. ; ##### With VESAOffs there are much less IMULs.
  6.  
  7. EXTRN _VESA_OFSTable:DWORD
  8. EXTRN _VESA_MinX:DWORD
  9. EXTRN _VESA_MaxX:DWORD
  10. EXTRN _VESA_MinY:DWORD
  11. EXTRN _VESA_MaxY:DWORD
  12. EXTRN _VESA_BpL:DWORD
  13. EXTRN _VESA_ScreenSize_Byte:DWORD
  14. EXTRN _VESA_Selector:WORD
  15.  
  16. VESAOffs EQU _VESA_OFSTable
  17. VESAMinX EQU _VESA_MinX
  18. VESAMinY EQU _VESA_MinY
  19. VESAMaxX EQU _VESA_MaxX
  20. VESAMaxY EQU _VESA_MaxY
  21. VESABpL  EQU _VESA_BpL
  22. VESAScrSize EQU _VESA_ScreenSize_Byte
  23. VESASel EQU _VESA_Selector
  24.  
  25. CODE SEGMENT PUBLIC DWORD USE32
  26.  
  27. ASSUME CS:CODE,FS:CODE
  28.  
  29. PUBLIC VESA_Line8B
  30. PUBLIC VESA_HLine8B
  31. PUBLIC VESA_HLineG8B
  32. PUBLIC VESA_HLineG8BFast
  33. PUBLIC VESA_HLineTex8B
  34. PUBLIC VESA_HLineTex8BFast
  35. PUBLIC VESA_HLineZ8B
  36. PUBLIC VESA_HLineGZ8B
  37. PUBLIC VESA_HLineTexZ8B
  38. PUBLIC VESA_FilledTriangle8B
  39. PUBLIC VESA_FilledTriangleG8B
  40. PUBLIC VESA_SetColor8B
  41. PUBLIC VESA_GetCodeAlias
  42. PUBLIC VESA_CopyScreen8B
  43. PUBLIC VESA_ClearScreen8B
  44. PUBLIC VESA_SetClipArea
  45. PUBLIC VESA_SyncDisplay
  46. PUBLIC VESA_SetDisplayStart
  47. PUBLIC VESA_ClearZBuffer
  48.  
  49. ; ###### Assume FS=CODE for Selfmodification.
  50. ; ###### Without this you get Compiler-Warnings.
  51. ASSUME FS:CODE
  52.  
  53. CodeAlias DW ?
  54.  
  55. VESA_SetDisplayStart PROC PASCAL X:WORD,Y:WORD
  56.  
  57.     ; ##### After calling this PROC the Graphic Adapter starts 
  58.     ; ##### scanning the Video-Memory from Row Y and Column X.
  59.  
  60.     MOV AX,04f07h
  61.     MOV BL,80h
  62.     MOV BH,0
  63.     MOV CX,X
  64.     MOV DX,Y
  65.     INT 10h
  66.     RET
  67.  
  68. VESA_SetDisplayStart ENDP
  69.  
  70. VESA_SyncDisplay PROC PASCAL
  71.  
  72.     ; ##### Waits for Vertical Retrace
  73.     ; ##### Maybe needed for 'no-flicker'.
  74.  
  75.     MOV DX,03DAh
  76.     
  77.   sd_Wait0:
  78.   
  79.     IN AL,DX
  80.     TEST AL,08h
  81.     JNZ sd_Wait0
  82.     
  83.   sd_Wait1:
  84.   
  85.     IN AL,DX
  86.     TEST AL,08h
  87.     JZ sd_Wait1
  88.     
  89.     RET
  90.  
  91. VESA_SyncDisplay ENDP
  92.  
  93. VESA_SetClipArea PROC PASCAL X1:DWORD,Y1:DWORD,X2:DWORD,Y2:DWORD
  94.  
  95.     ; ##### Changes the VESAMin- and VESAMax-Values.
  96.     ; ##### Fast routines can plug these Values directly
  97.     ; ##### in their code. This is much faster then
  98.     ; ##### CMPring to memory values. 
  99.   
  100.     ; ##### CodeAlias needed for Code Segment
  101.     ; ##### writes.
  102.     MOV FS,CS:CodeAlias
  103.  
  104.     MOV EAX,X1
  105.     MOV VESAMinX,EAX
  106.     MOV FS:Li8B_XCMPMinX,EAX
  107.     MOV FS:Li8B_YCMPMinX,EAX
  108.     MOV FS:HLi8BR_X2CMPMinX,EAX    
  109.     MOV FS:HLi8BR_X1CMPMinX,EAX
  110.     MOV FS:HLi8BR_MOVMinX,EAX
  111.     MOV FS:HLiG8B_CMPMinX,EAX
  112.     MOV FS:HLiG8B_CMPMinX2,EAX
  113.     MOV FS:HLiG8B_SUBMinX,EAX
  114.     MOV FS:HLiG8B_MOVMinX,EAX
  115.     
  116.     MOV EAX,Y1
  117.     MOV VESAMinY,EAX
  118.     MOV FS:Li8B_XCMPMinY,EAX
  119.     MOV FS:Li8B_YCMPMinY,EAX
  120.     MOV FS:HLi8BR_CMPMinY,EAX
  121.     MOV FS:HLiG8B_CMPMinY,EAX
  122.     
  123.     MOV EAX,X2
  124.     MOV VESAMaxX,EAX
  125.     MOV FS:Li8B_XCMPMaxX,EAX
  126.     MOV FS:Li8B_YCMPMaxX,EAX
  127.     MOV FS:HLi8BR_X2CMPMaxX,EAX    
  128.     MOV FS:HLi8BR_X1CMPMaxX,EAX
  129.     MOV FS:HLi8BR_MOVMaxX,EAX
  130.     MOV FS:HLiG8B_CMPMaxX,EAX
  131.     MOV FS:HLiG8B_CMPMaxX2,EAX
  132.     MOV FS:HLiG8B_MOVMaxX,EAX
  133.     
  134.     MOV EAX,Y2
  135.     MOV VESAMaxY,EAX
  136.     MOV FS:Li8B_XCMPMaxY,EAX
  137.     MOV FS:Li8B_YCMPMaxY,EAX
  138.     MOV FS:HLi8BR_CMPMaxY,EAX
  139.     MOV FS:HLiG8B_CMPMaxY,EAX
  140.     
  141.     RET
  142.     
  143. VESA_SetClipArea ENDP
  144.  
  145. VESA_SetColor8B PROC PASCAL NR:WORD,R:WORD,G:WORD,B:WORD
  146.  
  147.     ; ##### Sets the Palette Entry for Color NR.
  148.     ; ##### Red,Green and Blue Values from 0 to 255.
  149.  
  150.     MOV BL,BYTE PTR NR
  151.     MOV BH,0
  152.     MOV DH,BYTE PTR R
  153.     SHR DH,2
  154.     MOV CH,BYTE PTR G
  155.     SHR CH,2
  156.     MOV CL,BYTE PTR B
  157.     SHR CL,2
  158.     MOV AX,1010h
  159.     INT 10h
  160.     RET
  161.  
  162. VESA_SetColor8B ENDP
  163.  
  164. VESA_ClearScreen8B PROC PASCAL CO:DWORD,S:WORD
  165.  
  166.     ; ##### Clears the Screen 'S' in all 256-Color-Modes.
  167.     ; ##### Fills the Screen with Color CO.
  168.     ; ##### Uses fast DWORD STOS.
  169.     ; ##### The number of bytes cleared are taken from
  170.     ; ##### VESAScrSize=VESABpL*YResolution of the
  171.     ; ##### current Video Mode.
  172.     
  173.     MOV ECX,VESAScrSize
  174.     MOV EBX,ECX
  175.     AND EBX,11b
  176.     SHR ECX,2
  177.     MOV ES,S
  178.     XOR EDI,EDI
  179.     MOV EAX,CO
  180.     CLD
  181.     REP STOS DWORD ES:[EDI]
  182.     MOV ECX,EBX
  183.     REP STOS BYTE ES:[EDI]
  184.     
  185.     RET
  186.     
  187. VESA_ClearScreen8B ENDP
  188.  
  189. VESA_CopyScreen8B PROC PASCAL S:WORD,D:WORD
  190.  
  191.     ; ##### Copies the Screen 'S' to the Screen 'D' in all
  192.     ; ##### 256-Color-Modes.
  193.     ; ##### Uses fast DWORD MOVS.
  194.     ; ##### The number of bytes copied are taken from
  195.     ; ##### VESAScrSize=VESABpL*YResolution of the
  196.     ; ##### current Video Mode.
  197.     
  198.     MOV ECX,VESAScrSize
  199.     MOV EBX,ECX
  200.     AND EBX,11b
  201.     SHR ECX,2
  202.     MOV FS,S
  203.     XOR ESI,ESI
  204.     MOV ES,D
  205.     XOR EDI,EDI
  206.     CLD
  207.     REP MOVS DWORD ES:[EDI],FS:[ESI]
  208.     MOV ECX,EBX
  209.     REP MOVS BYTE ES:[EDI],FS:[ESI]
  210.   
  211.     RET
  212.     
  213. VESA_CopyScreen8B ENDP
  214.  
  215. VESA_GetCodeAlias PROC PASCAL
  216.  
  217.     ; ##### Because writing to Code Segment causes a protection fault,
  218.     ; ##### we have to create a Code Alias Selector, to which we can
  219.     ; ##### write. This is done by DPMI Function 000ah.
  220.     
  221.     MOV AX,0000ah
  222.     MOV BX,CS
  223.     INT 031h
  224.     MOV FS,AX
  225.     MOV FS:CodeAlias,AX
  226.     RET
  227.     
  228. VESA_GetCodeAlias ENDP
  229.  
  230. VESA_Line8B PROC PASCAL X1:DWORD,Y1:DWORD,X2:DWORD,Y2:DWORD,C:DWORD,S:WORD
  231.  
  232.     ; ##### 
  233.     ; ##### Line8B draws a Line from (X1,Y1) to (X2,Y2) in all
  234.     ; ##### 256-Color-Modes. C is used as color and S as the 
  235.     ; ##### Screenselector.
  236.     ; ##### 
  237.  
  238.     ; ##### FS = CodeAlias for Self-Modification
  239.     ; ##### GS = Selector of Screen
  240.     MOV FS,CS:CodeAlias
  241.     MOV GS,S
  242.  
  243.     ; ##### ECX  = X2-X1    
  244.     ; ##### EAX  = ABS( ECX )
  245.     ; ##### AddX = ( X2-X1 > 0 ? 1 : -1 )
  246.     MOV EAX,X2
  247.     SUB EAX,X1
  248.     MOV ECX,EAX
  249.     MOV DWORD FS:Li8B_AddX,1
  250.     JNS Li8B_DXPos
  251.     MOV DWORD FS:Li8B_AddX,-1
  252.     NEG EAX
  253.     
  254.   Li8B_DXPos: 
  255.   
  256.     ; ##### EDX  = Y2-Y1
  257.     ; ##### EBX  = ABS( EDX )
  258.     ; ##### AddY = ( Y2-Y1 > 0 ? 1 : -1 )
  259.     MOV EBX,Y2
  260.     SUB EBX,Y1
  261.     MOV EDX,EBX
  262.     MOV DWORD FS:Li8B_AddY,1
  263.     JNS Li8B_DYPos
  264.     MOV DWORD FS:Li8B_AddY,-1
  265.     NEG EBX
  266.     
  267.   Li8B_DYPos: 
  268.   
  269.     ; ##### Walk along X-Axis or Y-Axis ?
  270.     CMP EBX,EAX
  271.     JLE Li8B_ADXBigger
  272.     
  273.       ; ##### Calculate M = (X2-X1)/ABS(Y2-Y1) * 2^16
  274.       OR EBX,EBX
  275.       JZ Li8B_DYZero
  276.       MOV EAX,ECX
  277.       SHL EAX,16
  278.       CDQ
  279.       IDIV EBX   
  280.       MOV FS:Li8B_YM,EAX
  281.       
  282.     Li8B_DYZero:
  283.  
  284.       ; ##### ECX = Number of Pixs  
  285.       ; ##### EAX = Color
  286.       ; ##### EDX = X1 * 2^16
  287.       ; ##### EBX = Y1  
  288.       MOV ECX,EBX
  289.       INC ECX
  290.       MOV EAX,C 
  291.       MOV EDX,X1
  292.       SHL EDX,16
  293.       MOV EBX,Y1
  294.       
  295.     Li8B_LoopY:
  296.     
  297.       ; ##### ESI = INT( X );
  298.       MOV ESI,EDX
  299.       SAR ESI,16
  300.       
  301.       ; ##### Clipping ...
  302.       ; ##### The Clipping-Values are set by 'SetClipArea'
  303.       
  304.       ; ##### CMP ESI,YCMPMinX 
  305.       DB 081h, 0feh
  306.       Li8B_YCMPMinX DD ?               
  307.       JL Li8B_YNoPix
  308.       
  309.       ; ##### CMP ESI,YCMPMaxX
  310.       DB 081h, 0feh
  311.       Li8B_YCMPMaxX DD ?               
  312.       JG Li8B_YNoPix
  313.       
  314.       ; ##### CMP EBX,YCMPMinY
  315.       DB 081h, 0fbh
  316.       Li8B_YCMPMinY DD ?               
  317.       JL Li8B_YNoPix
  318.       
  319.       ; ##### CMP EBX,YCMPMaxY
  320.       DB 081h, 0fbh
  321.       Li8B_YCMPMaxY DD ?               
  322.       JG Li8B_YNoPix
  323.       
  324.         ; ##### ' Pix( ESI, EBX, AL ) '
  325.         ; ##### These two are the only memory references
  326.         ; ##### in the LOOP. It should be fast.
  327.         MOV EDI,VESAOffs[EBX*4]
  328.         MOV GS:[EDI+ESI],AL
  329.         
  330.     Li8B_YNoPix:  
  331.  
  332.       ; ##### Calculate new X- and Y-Values and go on... 
  333.     
  334.       ; ##### ADD EDX,M means 'ADD X,M'
  335.       DB 081h, 0c2h
  336.       Li8B_YM DD ?                     
  337.       
  338.       ; ##### ADD EBX,AddY means 'ADD Y,AddY'
  339.       DB 081h, 0c3h
  340.       Li8B_AddY DD ?                   
  341.       
  342.       LOOP Li8B_LoopY   
  343.       
  344.       RET
  345.       
  346.   Li8B_ADXBigger: 
  347.   
  348.       ; ##### ECX = Number of Pixs
  349.       MOV ECX,EAX
  350.       INC ECX   
  351.       
  352.       ; ##### Calculate M = (Y2-Y1)/ABS(X2-X1) * 2^16
  353.       OR EAX,EAX
  354.       JZ Li8B_DXZero
  355.